﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using BLL;
using WcfServices.ServiceInterfaces;
using EntitiesLayer;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.Net;
using System.Data.SqlClient;
using WcfServices.Utilities;
using System.IO;
using System.Globalization;

namespace WcfServices
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class MusculosService : IMusculoService
    {

        private GestorMantMusculos gestor;
        public MusculosService()
        {
            gestor = new GestorMantMusculos();
        }


        public string ListarMusculosPrimarios(int idEjericio)
        {
            IList<Musculos> lista =Util.interceptWithReturn(
               () => gestor.listarMusculosPrimarios(idEjericio));
            if(lista!=null)
                return JsonConvert.SerializeObject(lista, new StringEnumConverter());

            return "";
        }
        public string ListarMusculosSecundarios(int idEjericio)
        {
            IList<Musculos> lista = Util.interceptWithReturn(
               () => gestor.ListarMusculosSecundarios(idEjericio));
            if (lista != null)
                return JsonConvert.SerializeObject(lista, new StringEnumConverter());

            return "";
          
        }



        public void Create(Stream json)
        {
            dynamic musculo = json.DeserializeJson<dynamic>();

            gestor.registrarMusculo(musculo.Nombre.ToString(),
                Convert.ToInt32(musculo.Tipo),
                Convert.ToInt32(musculo.Ubicacion));

            Util.interceptWithNoReturn(gestor.guardarCambios);
        }


        public string Listar()
        {
            IEnumerable<Musculos> lista = Util.interceptWithReturn(gestor.listarMusculo);
            if (lista != null)
                return JsonConvert.SerializeObject(lista, new StringEnumConverter());

            return "";
        }

        public string BuscarPorId(int id)
        {
            Musculos lista = Util.interceptWithReturn(
                ()=>gestor.consultarPorId(id));
            if (lista != null)
                return JsonConvert.SerializeObject(lista, new StringEnumConverter());

            return "";
        }

        public void Update(Stream json)
        {
             dynamic musculo = json.DeserializeJson<dynamic>();

                gestor.actualizarMusculo(
                    Convert.ToInt32(musculo.Id),
                    musculo.Nombre.ToString(),
                   Convert.ToInt32(musculo.Tipo),
                   Convert.ToInt32(musculo.Ubicacion));
            
            Util.interceptWithNoReturn(gestor.guardarCambios);

         

        }

        public string ConstantesMusculos()
        {
            JArray ubicaciones = new JArray();

            foreach (Ubicacion u in Enum.GetValues(typeof(Ubicacion)))
            {
                ubicaciones.Add(
                    JObject.FromObject(
                        new { Id = (int)u, Name = Enum.GetName(typeof(Ubicacion), u) })
                    );
            }
            
            JArray tipo = new JArray();

            foreach (TipoMusculo u in Enum.GetValues(typeof(TipoMusculo)))
                tipo.Add( 
                    JObject.FromObject(
                        new { Id = (int)u, Name = Enum.GetName(typeof(TipoMusculo), u) })
                    );
            
            JObject constantes= JObject.FromObject(new { Ubicacion=ubicaciones, Tipo=tipo });

            return constantes.ToString(Formatting.None);
        }

        public void Delete(int id)
        {
            gestor.eliminarMusculo(id);
            Util.interceptWithNoReturn(gestor.guardarCambios);
            
        }


        public void SobrescribirRelacionesPrimarios(long ejercicio, long[] musculos)
        {
            
            Util.interceptWithNoReturn(
                () =>
                {
                    gestor.AsignarMuchosMusculosP(ejercicio, musculos, true);
                });
        }

        public void SobrescribirRelacionesSecundarios(long ejercicio, long[] musculos)
        {
              Util.interceptWithNoReturn(
                () =>
                {
                    gestor.AsignarMuchosMusculosP(ejercicio, musculos, true);
                });
        }

        /// <summary>
        /// </summary>
        /// <param name="ejercicio"></param>
        /// <param name="primarios"></param>
        /// <param name="secundarios"></param>
        public void SobrescribirRelaciones(long ejercicio, long[] primarios, long[] secundarios)
        {
            Util.interceptWithNoReturn(
                () =>
                    gestor.AsignarMuchosSPTrasaccion(ejercicio, primarios,
                      secundarios, true)
                );
        }
    }
}
